/**
 * @(#) MEImpl.java
 */

package receiver;

import invoker.Observateur;

import java.util.ArrayList;
import java.util.Collection;

import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;

public class MEImpl implements ME , Sujet
{
	/**
	 * attribut du type presse papier 
	 */
	private PressePapier pressePapier;
	
	/**
	 * attribut du type selection
	 */
	private Selection selection;
	
	/**
	 * attribut du type Buffer
	 */
	private Buffer buffer;
	
	/**
	 * la liste des observateurs du moteur d'edition
	 */
	ArrayList<Observateur> observateurs;
	/**
	 * construit un MEImpl
	 * @param b le buffer
	 * @param pp le presse papier
	 * @param s la selection
	 */
	public  MEImpl(Buffer b,PressePapier pp, Selection s){
		
		this.buffer = b;
		this.pressePapier = pp;
		this.selection = s;
		
		//on crée la collection des observateurs
		observateurs = new ArrayList<Observateur>();
		
	}
	
	/**
	 * une methode pour couper du texte a partir du buffer et inserer dans le presse papier
	 */
	@Override
	public void couper() {
		
		//on verifie que la selection n'est nulle
		String select = buffer.getContenu(selection.getDebut(), selection.getFin());
		if(select == "" || select == null)
			return;
		
		pressePapier.setContenu(select);
		//pressePapier.setViensDeCouper(true);
		buffer.effacer(selection.getDebut(), selection.getFin());
		
		//la position de fin devient la position debut
		selection.setFin(selection.getDebut());
		//on notifie les observateur
		
		notifierObservateur();
		System.out.println("Couper: " + pressePapier.getContenu());
		System.out.println("buffer " + buffer.getContenu());
	}

	/**
	 * une methode pour coupier du texte a partir du buffer et inserer dans le presse papier
	 */
	@Override
	public void copier() {
		String select = buffer.getContenu(selection.getDebut(), selection.getFin());
		pressePapier.setContenu(select);
		//pressePapier.setViensDeCouper(false);
		//on verifie que la selection n'est pas nulle
		if(select == "" || select == null)
			return;
		
		notifierObservateur();
		System.out.println("Copier: " + pressePapier.getContenu());
		System.out.println("buffer " + buffer.getContenu());
	}

	/**
	 * une methode pour inserer du texte dans le buffer a partir du presse papier
	 */
	@Override
	public void coller() {
		
		//on verifie que la selection n'est pas nulle
		String select = pressePapier.getContenu();
		if(select == null)
			return;
		
		//s'il ya une selection
		if ( selection.getDebut() < selection.getFin()){
			buffer.effacer(selection.getDebut() , selection.getFin());
			selection.setFin(selection.getDebut());
		}
		buffer.inserer(select, selection.getDebut());
		//on met a jour la position du cursseur
		selection.setFin(selection.getDebut()+pressePapier.getContenu().length());
		selection.setDebut(selection.getDebut()+pressePapier.getContenu().length());
		
		notifierObservateur();
		System.out.println("Coller: " + pressePapier.getContenu());
		System.out.println("buffer " + buffer.getContenu());
	}

	/**
	 * une methode pour definir le debut et la fin du texte
	 * @param debut : le debut de selection
	 * @param fin : la fin de selection
	 */
	@Override
	public void selectionner(int debut, int fin) {
		selection.setDebut(debut);
		selection.setFin(fin);	
		
		//notifierObservateur();
		System.out.println("Selectionner :" + debut +"  "+ fin);
	}
	/**
	 * une methode pour inserer une chaine de caractere dans le buffer
	 * @param t : chaine de caractere
	 */
	@Override
	public void saisirTexte(String t) {
		//s'il ya une selection
		if ( selection.getDebut() < selection.getFin()){
			buffer.effacer(selection.getDebut() , selection.getFin());
			selection.setFin(selection.getDebut());
		}
				
		buffer.inserer(t, selection.getDebut());
		
		System.out.println("Saisie: "+ t);
		System.out.println(buffer.getContenu());
	}
	
	//nouveau: on efface la selection
	/**
	 * une methode pour effacer du texte dans le buffer
	 */
	public void effacerTexte(){
		String texte = buffer.effacer(selection.getDebut(), selection.getFin());
		//notifierObservateur();
		System.out.println("Effacer: "+texte);
		System.out.println(buffer.getContenu());
	}
	/**
	 * une methode pour ajouter un observateur dans la liste des observateurs
	 */
	@Override
	public void ajouterObservateur(Observateur o) {
		observateurs.add(o);		
	}
	/**
	 * une methode pour enlever un observateur dans la liste des observateurs
	 */
	@Override
	public void enleverObservateur(Observateur o) {
		observateurs.remove(o);
	}
	/**
	 * une methode pour notifier les observateurs
	 */
	@Override
	public void notifierObservateur() {
		System.out.println("notif par me");
		for(int i = 0; i < observateurs.size() ; i++)
			( (Observateur) observateurs.get(i) ).actualiser((MEImpl)this);
		
	}
	/**
	 * une methode pour retourner le contenu entier du buffer
	 * @return une chaine de caracteres de type String
	 */
	public String getContenuBuffer(){
		return buffer.getContenu();
	}
	/**
	 * une methode pour obtenir le debut de la selection
	 * @return le debut de selection de type int
	 */
	public int getPostionDebutCurseur(){
		return selection.getDebut();
	}
	/**
	 * une methode pour obtenir la fin de la selection
	 * @return la fin de selection de type int
	 */
	public int getPostionFintCurseur(){
		return selection.getFin();
	}
	/**
	 * une methode pour retourner le contenu du presse papier
	 * @return le contenu du presse papier du type String
	 */
	public String getPressePapier() {
		return pressePapier.getContenu();
	}
	
}
